<?php
    // +----------------------------------------------------------------------
    // | Created by PHPstorm: JRKAdmin框架 [ JRKAdmin ] 
    // +----------------------------------------------------------------------
    // | Copyright (c) 2019~2022 [LuckyHHY] All rights reserved.
    // +----------------------------------------------------------------------
    // | SiteUrl: http://www.luckyhhy.cn
    // +----------------------------------------------------------------------
    // | Author: LuckyHhy <jackhhy520@qq.com>
    // +----------------------------------------------------------------------
    // | Date: 2020/3/19-10:05
    // +----------------------------------------------------------------------
    // | Description:  
    // +----------------------------------------------------------------------


    namespace Jrk;


    class Http
    {

        /**
         * @param $url
         * @param array $params
         * @param array $options
         * @return mixed|string
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @date: 2020/3/19
         * @name: post
         * @describe:发送一个POST请求
         */
        public static function post($url, $params = [], $options = [])
        {
            $req = self::sendRequest($url, $params, 'POST', $options);
            return $req['ret'] ? $req['msg'] : '';
        }

        /**
         * @param $url
         * @param array $params
         * @param array $options
         * @return mixed|string
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @date: 2020/3/19
         * @name: get
         * @describe: 发送一个GET请求
         */
        public static function get($url, $params = [], $options = [])
        {
            $req = self::sendRequest($url, $params, 'GET', $options);
            return $req['ret'] ? $req['msg'] : '';
        }

        /**
         * @param $url
         * @param array $params
         * @param string $method
         * @param array $options
         * @return array
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @date: 2020/3/19
         * @name: sendRequest
         * @describe: CURL发送Request请求,含POST和REQUEST
         */
        public static function sendRequest($url, $params = [], $method = 'POST', $options = [])
        {
            $method = strtoupper($method);
            $protocol = substr($url, 0, 5);
            $query_string = is_array($params) ? http_build_query($params) : $params;

            $ch = curl_init();
            $defaults = [];
            if ('GET' == $method) {
                $geturl = $query_string ? $url . (stripos($url, "?") !== false ? "&" : "?") . $query_string : $url;
                $defaults[CURLOPT_URL] = $geturl;
            } else {
                $defaults[CURLOPT_URL] = $url;
                if ($method == 'POST') {
                    $defaults[CURLOPT_POST] = 1;
                } else {
                    $defaults[CURLOPT_CUSTOMREQUEST] = $method;
                }
                $defaults[CURLOPT_POSTFIELDS] = $query_string;
            }

            $defaults[CURLOPT_HEADER] = false;
            $defaults[CURLOPT_USERAGENT] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.98 Safari/537.36";
            $defaults[CURLOPT_FOLLOWLOCATION] = true;
            $defaults[CURLOPT_RETURNTRANSFER] = true;
            $defaults[CURLOPT_CONNECTTIMEOUT] = 3;
            $defaults[CURLOPT_TIMEOUT] = 3;

            // disable 100-continue
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));

            if ('https' == $protocol) {
                $defaults[CURLOPT_SSL_VERIFYPEER] = false;
                $defaults[CURLOPT_SSL_VERIFYHOST] = false;
            }

            curl_setopt_array($ch, (array)$options + $defaults);

            $ret = curl_exec($ch);
            $err = curl_error($ch);

            if (false === $ret || !empty($err)) {
                $errno = curl_errno($ch);
                $info = curl_getinfo($ch);
                curl_close($ch);
                return [
                    'ret'   => false,
                    'errno' => $errno,
                    'msg'   => $err,
                    'info'  => $info,
                ];
            }
            curl_close($ch);
            return [
                'ret' => true,
                'msg' => $ret,
            ];
        }


        /**
         * @param $url
         * @param bool $params
         * @param int $ispost
         * @return bool|string
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @date: 2020/3/26
         * @name: freeApiCurl
         * @describe:请求接口返回内容
         */
        public static function ApiCurl($url,$params=false,$ispost=0){
            $ch = curl_init();
            curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
            curl_setopt( $ch, CURLOPT_HTTP_VERSION , CURL_HTTP_VERSION_1_1 );
            curl_setopt( $ch, CURLOPT_USERAGENT , 'free-api' );
            curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT , 60 );
            curl_setopt( $ch, CURLOPT_TIMEOUT , 60);
            curl_setopt( $ch, CURLOPT_RETURNTRANSFER , true );
            if( $ispost )
            {
                curl_setopt( $ch , CURLOPT_POST , true );
                curl_setopt( $ch , CURLOPT_POSTFIELDS , $params );
                curl_setopt( $ch , CURLOPT_URL , $url );
            }
            else
            {
                if($params){
                    curl_setopt( $ch , CURLOPT_URL , $url.'?'.$params );
                }else{
                    curl_setopt( $ch , CURLOPT_URL , $url);
                }
            }
            $response = curl_exec( $ch );
            if ($response === FALSE) {
                return false;
            }
            curl_close( $ch );
            return $response;
        }

        /**
         * @param $url
         * @param array $params
         * @param string $method
         * @return bool
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @date: 2020/3/19
         * @name: sendAsyncRequest
         * @describe:异步发送一个请求
         */
        public static function sendAsyncRequest($url, $params = [], $method = 'POST')
        {
            $method = strtoupper($method);
            $method = $method == 'POST' ? 'POST' : 'GET';
            //构造传递的参数
            if (is_array($params)) {
                $post_params = [];
                foreach ($params as $k => &$v) {
                    if (is_array($v)) {
                        $v = implode(',', $v);
                    }
                    $post_params[] = $k . '=' . urlencode($v);
                }
                $post_string = implode('&', $post_params);
            } else {
                $post_string = $params;
            }
            $parts = parse_url($url);
            //构造查询的参数
            if ($method == 'GET' && $post_string) {
                $parts['query'] = isset($parts['query']) ? $parts['query'] . '&' . $post_string : $post_string;
                $post_string = '';
            }
            $parts['query'] = isset($parts['query']) && $parts['query'] ? '?' . $parts['query'] : '';
            //发送socket请求,获得连接句柄
            $fp = fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 3);
            if (!$fp) {
                return false;
            }
            //设置超时时间
            stream_set_timeout($fp, 3);
            $out = "{$method} {$parts['path']}{$parts['query']} HTTP/1.1\r\n";
            $out .= "Host: {$parts['host']}\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "Content-Length: " . strlen($post_string) . "\r\n";
            $out .= "Connection: Close\r\n\r\n";
            if ($post_string !== '') {
                $out .= $post_string;
            }
            fwrite($fp, $out);
            //echo fread($fp, 1024);
            fclose($fp);
            return true;
        }

        /**
         * @param $file
         * @param bool $delaftersend
         * @param bool $exitaftersend
         * @author: LuckyHhy <jackhhy520@qq.com>
         * @date: 2020/3/19
         * @name: sendToBrowser
         * @describe:发送文件到客户端
         */
        public static function sendToBrowser($file, $delaftersend = true, $exitaftersend = true)
        {
            if (file_exists($file) && is_readable($file)) {
                header('Content-Description: File Transfer');
                header('Content-Type: application/octet-stream');
                header('Content-Disposition: attachment;filename = ' . basename($file));
                header('Content-Transfer-Encoding: binary');
                header('Expires: 0');
                header('Cache-Control: must-revalidate, post-check = 0, pre-check = 0');
                header('Pragma: public');
                header('Content-Length: ' . filesize($file));
                ob_clean();
                flush();
                readfile($file);
                if ($delaftersend) {
                    unlink($file);
                }
                if ($exitaftersend) {
                    exit;
                }
            }
        }

    }